﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;

namespace Clinica_Frba
{
    public partial class ListaProfesionales : Form
    {
        public char accion;
        private Conexion sqlCon = Conexion.getInstance();
        private Utility util = Utility.getInstance();
        private string consulta;
        public int idMedSelected = -1;

        public ListaProfesionales()
        {
            InitializeComponent();
        }

        public int searchMedico()
        {
            this.accion = Profesional.Display;
            this.buttonSelectMed.Visible = true;
            this.ShowDialog();
            return idMedSelected;
        }

        private void ListaProfesionales_Load(object sender, EventArgs e)
        {
            dGridProf.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
            dGridProf.MultiSelect = false;

            if (accion == Profesional.Display)
                this.actionButton.Click += new System.EventHandler(this.visualizar_Click);

            if (accion == Profesional.Baja)
            {
                this.Text = "Baja de Profesional";
                this.actionButton.Text = "Dar de Baja";
                this.actionButton.Click += new System.EventHandler(this.eliminar_Click);
            }

            if (accion == Profesional.Edit)
            {
                this.Text = "Modificar Profesional";
                this.actionButton.Text = "Modificar";
                this.actionButton.Click += new System.EventHandler(this.modificar_Click);
            }

            //Fill listbox de especialidades
            loadEspecialidades();
        }

        private void loadEspecialidades()
        {
            SqlDataAdapter adapter;
            DataTable table = new DataTable();
            DataRow row;

            //Fill ComboBox de especialidades
            adapter = sqlCon.execQueryGrid("SELECT Cod_Especialidad, Esp_Descripcion FROM b_sharp.Especialidades;");
            adapter.Fill(table);
            //Insertar fila vacia
            row = table.NewRow();
            row[0] = -1;
            table.Rows.InsertAt(row, 0);

            especialidad.DataSource = table;
            especialidad.DisplayMember = "Esp_Descripcion";
            especialidad.ValueMember = "Cod_Especialidad";
        }

        private void buscar_Click(object sender, EventArgs e)
        {
            string qSelect, qFrom, qWhere;
            SqlDataAdapter adapter;
            DataTable table = new DataTable();

            if (!checkNumericFields())
                return;

            qSelect = "SELECT me.id_medico, me.Medico_Nombre, me.Medico_Apellido, me.Medico_Tipo_Doc, me.Medico_Num_Doc, me.Medico_Matricula, me.Medico_Mail ";
            qFrom = "FROM b_sharp.Medicos me ";
            qWhere = "WHERE me.Medico_Nombre like '%" + medicoNombre.Text + "%'" + 
                     "  AND me.Medico_Apellido like '%" + medicoApe.Text + "%'" + 
                     "  AND me.Medico_Tipo_Doc like '%" + tipoDoc.SelectedItem + "%'" +
                     "  AND me.Medico_Num_Doc like '%" + nroDoc.Text + "%'" +
                     "  AND isnull(me.Medico_Matricula,0) like '%" + matricula.Text + "%'" +
                     "  AND me.Medico_Mail like '%" + mail.Text + "%' ";

            if ((decimal)especialidad.SelectedValue != -1)
            {
                qFrom += "JOIN b_sharp.EspecialidadMedico esp ON me.id_medico = esp.id_medico ";
                qWhere += "AND esp.Cod_Especialidad = " + (decimal)especialidad.SelectedValue + " ";
            }

            consulta = qSelect + qFrom + qWhere + ";";

            adapter = sqlCon.execQueryGrid(consulta);
            adapter.Fill(table);
            dGridProf.DataSource = table;
        }

        private bool checkNumericFields()
        {
            string message = "";

            if (nroDoc.Text.Length > 0 && !util.isNumber(nroDoc.Text))
                message += "El numero de documento contiene caracteres incorrectos\n";

            if (matricula.Text.Length > 0 && !util.isNumber(matricula.Text))
                message += "El numero de matricula contiene caracteres incorrectos\n";

            if (message.Length > 0)
            {
                MessageBox.Show(message, "Mensajes de Error");
                return false;
            }

            return true;
        }

        private void limpiar_Click(object sender, EventArgs e)
        {
            //Limpiar grid
            while (dGridProf.Rows.Count > 0)
                dGridProf.Rows.RemoveAt(0);

            //Limpiar filtros
            foreach (Control control in this.group.Controls)
            {
                if ((control.GetType().ToString() == "System.Windows.Forms.ComboBox") | (control.GetType().ToString() == "System.Windows.Forms.TextBox"))
                {
                    control.ResetText();
                }
            }
        }

        private void modificar_Click(object sender, EventArgs e)
        {
            Profesional formProf;
            int idMed;

            idMed = (int)dGridProf.SelectedRows[0].Cells[0].Value;

           //Llamar al formulario Profesional
            formProf = new Profesional();
            formProf.accion = this.accion;
            formProf.idSelectedMedico = idMed;
            formProf.ShowDialog();
            
            //Actualizar datos
            refreshGrid();
        }

        private void refreshGrid()
        {
            //Actualizar el grid haciendo una nueva busqueda de los datos
            DataTable table = new DataTable();
            SqlDataAdapter adapter = sqlCon.execQueryGrid(consulta);
            adapter.Fill(table);
            dGridProf.DataSource = table;
        }

        private void eliminar_Click(object sender, EventArgs e)
        {
            int idMed;
            SqlCommand cmd;

            // Profesional seleccionado
            idMed = (int)dGridProf.SelectedRows[0].Cells[0].Value;

            // Baja logica del profesional
            cmd = new SqlCommand("UPDATE b_sharp.Medicos SET bajaLogica = 'S' WHERE id_medico = " + idMed + ";", sqlCon.openCon());
            cmd.ExecuteNonQuery();

            // Cancelar turnos del medico
            cancelarTurnos(idMed);
        }

        private void cancelarTurnos(int idMed)
        {
            SqlCommand cmd;
            string insert;

            insert = "INSERT INTO b_sharp.Cancelaciones " +
                     " SELECT Turno_Numero, 2, 'Medico dado de baja' " +
                     " FROM b_sharp.Turnos " +
                     " WHERE Medico_ID = " + idMed + ";";

            cmd = new SqlCommand(insert,sqlCon.openCon());
            cmd.ExecuteNonQuery();
        }

        private void visualizar_Click(object sender, EventArgs e)
        {
            Profesional formProf;
            int idMed;

            idMed = (int)dGridProf.SelectedRows[0].Cells[0].Value;

            //Llamar al formulario Profesional
            formProf = new Profesional();
            formProf.accion = this.accion;
            formProf.idSelectedMedico = idMed;
            formProf.ShowDialog();
        }

        private void buttonSelectMed_Click(object sender, EventArgs e)
        {
            if (dGridProf.SelectedRows.Count > 0)
            {
                idMedSelected = (int)dGridProf.SelectedRows[0].Cells[0].Value;
                this.Close();
            }
        }
    }
}
